package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

const dsn = "gva:gvagva@tcp(172.1.4.155:3306)/gormtest?charset=utf8mb4&parseTime=True&loc=Local"

type UserTop struct {
	gorm.Model
	Name string `gorm:"unique"` // 添加 unique 标签
	Age  int8
	Hit  int64
}

func main() {
	fmt.Println("Gorm 数据库操作")
	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败")
	}
	db.AutoMigrate(&UserTop{})
	//user := UserTop{Name: "山顶洞人", Age: 89}
	//
	//result := db.Create(&user) // 通过数据的指针来创建
	//fmt.Println(result)
	//fmt.Println(user.ID)
	// 创建 gin 引擎

	// 修改数据库表中 id 为 114 的记录，将 hit 字段值设置为 88888

	//var user UserTop
	//var hits2 int64 = 9223372036854775807
	//if err := db.First(&user, 114).Error; err != nil {
	//	fmt.Println("未找到指定用户记录:", err)
	//} else {
	//	result := db.Model(&user).Update("Hit", hits2)
	//	if result.Error != nil {
	//		fmt.Println("更新 Hit 字段失败:", result.Error)
	//	} else {
	//		fmt.Println("Hit 字段更新成功")
	//	}
	//}

	r := gin.Default()

	// 定义 view 路由，通过查询参数获取用户 ID
	r.GET("/view", func(c *gin.Context) {
		// 从查询参数中获取用户 ID
		idStr := c.Query("id")
		if idStr == "" {
			c.JSON(400, gin.H{
				"error": "请提供用户 ID",
			})
			return
		}

		var user UserTop
		// 根据用户 ID 查找用户记录
		if err := db.First(&user, idStr).Error; err != nil {
			c.JSON(404, gin.H{
				"error": "未找到指定用户记录",
			})
			return
		}

		// 自增 Hit 字段
		if err := db.Model(&user).Update("Hit", gorm.Expr("Hit + ?", 1)).Error; err != nil {
			c.JSON(500, gin.H{
				"error": "更新 Hit 字段失败",
			})
			return
		}

		// 查询更新后的 Hit 值
		if err := db.First(&user, idStr).Error; err != nil {
			c.JSON(500, gin.H{
				"error": "查询更新后的用户记录失败",
			})
			return
		}

		c.JSON(200, gin.H{
			"Action":   "点赞成功",
			"new_hit":  user.Hit,
			"message":  "你点赞的用户名：",
			"UserInfo": user.Name,
		})
	})
	// 添加 top 路由
	r.GET("/top", func(c *gin.Context) {
		var users []UserTop
		// 按照 Hit 字段降序排序，取前 15 条记录
		result := db.Order("Hit DESC").Select("id", "name", "hit").Limit(50).Find(&users)
		if result.Error != nil {
			c.JSON(500, gin.H{
				"error": "查询前 15 名用户失败",
			})
			return
		}

		c.JSON(200, gin.H{
			"message": "成功查询前 15 名用户",
			"users":   users,
		})
	})

	// 添加删除用户的路由
	r.GET("/del/:id", func(c *gin.Context) {
		id := c.Param("id")
		var user UserTop
		// 先检查用户是否存在
		if err := db.First(&user, id).Error; err != nil {
			c.JSON(404, gin.H{
				"error": "未找到指定用户记录",
			})
			return
		}
		// 删除用户
		if err := db.Delete(&user).Error; err != nil {
			c.JSON(500, gin.H{
				"error": "删除用户失败",
			})
			return
		}
		c.JSON(200, gin.H{
			"message": "用户删除成功",
		})
	})
	// 启动服务器
	if err := r.Run(":8080"); err != nil {
		fmt.Printf("服务器启动失败: %v\n", err)
	}

}
